﻿'''
题目描述
给一个二维数组 nums，对于每一个元素 nums[i]，找出距离最近的且值相等的元素，
输出横纵坐标差值的绝对值之和，如果没有等值元素，则输出-1。
输入描述
输入第一行为二维数组的行
输入第二行为二维数组的列
输入的数字以空格隔开。
备注
针对数组 nums[i][j]，满足 0 < i ≤ 100，0 < j ≤ 100
对于每个数字，最多存在 100 个与其相等的数字
输出描述
数组形式返回所有坐标值。
示例1
输入
3
5
0 3 5 4 2
2 5 7 8 3
2 5 4 2 4
输出
[[-1, 4, 2, 3, 3], [1, 1, -1, -1, 4], [1, 1, 2, 3, 2]]
解题思路
题目描述：
给定一个二维数组 nums，对于数组中的每个元素 nums[i][j]，需要找到距离最近的、与其值相等的另一个元素 nums[x][y]，并计算
这两个元素之间的“曼哈顿距离”（即横纵坐标差值的绝对值之和）。
如果找不到其他等值的元素，则返回 -1。
'''
#题目描述：给一个二维数组 nums，对于每一个元素 nums[i]，找出距离最近的且值相等的元素，
#输出横纵坐标差值的绝对值之和，如果没有等值元素，则输出-1。

#输入描述：输入第一行为二维数组的行，输入第二行为二维数组的列，输入的数字以空格隔开。
#输出描述：数组形式返回所有坐标值。

#需要用到defaultdict，用于创建一个有默认值的字典，需要从collections模块导入defaultdict包
#创建defaultdict时，需传递一个工厂函数作为第一个参数，这个工厂函数用于生成默认值。常见工厂函数有int、float、list、set 等。
from collections import defaultdict

#读入 第一行二维数组的行m
m = int(input())
#读入 第二行二维数组的列n
n = int(input())
#读入 之后m行数字以空格隔开并存储二维数组中
numArr = [list(map(int,input().split())) for _ in range(m)] #注意list用到每行
#定义默认值为list的字典，用来存储数字的位置
numPostion = defaultdict(list)
#遍历二维数组，存储数字和位置到字典
for i in range(m):
    for j in range(n):
        num = numArr[i][j]
        numPostion[num].append((i,j))
#新建二维结果数组初始化为-1
result = [[-1] * n for _ in range(m)]
#遍历二维数组计算曼哈顿距离
for i in range(m):
    for j in range(n):
        num = numArr[i][j]
        minDist = float('inf') #使用float('inf')表示正无穷大，int('inf')不支持会报错ValueError
        if len(numPostion[num]) != 1:#有相等数字
            for (x,y) in numPostion[num]:
                if (x,y) != (i,j):
                    dist = abs(x - i) + abs(y - j)  #计算该数字的曼哈顿距离
                    minDist = min(dist,minDist)     #更新最小距离
            result[i][j] = minDist
#输出结果
print(result)

